package cn.lccabc.characterString.no0205;

import java.util.HashMap;
import java.util.Map;

/**
 * @program: leet-code
 * @description: 同构字符串
 * 给定两个字符串 s 和 t，判断它们是否是同构的。
 *
 * 如果 s 中的字符可以被替换得到 t ，那么这两个字符串是同构的。
 *
 * 所有出现的字符都必须用另一个字符替换，同时保留字符的顺序。两个字符不能映射到同一个字符上，但字符可以映射自己本身。
 *
 * 示例 1:
 *
 * 输入: s = "egg", t = "add"
 * 输出: true
 * 示例 2:
 *
 * 输入: s = "foo", t = "bar"
 * 输出: false
 * 示例 3:
 *
 * 输入: s = "paper", t = "title"
 * 输出: true
 * 说明:
 * 你可以假设 s 和 t 具有相同的长度。
 * @author: LiCC
 * @create: 2020-01-11 20:56
 */
public class Solution {

    public static boolean isIsomorphic(String s, String t) {
//        int[] a = new int[128], b = new int[128];
//        for (int i = 0; i < s.length(); i++){
//            char cs = s.charAt(i), ct = t.charAt(i);
//            if (a[cs] != b[ct]){
//                return false;
//            } else if (a[cs] == 0){
//                a[cs] = 1 + i;
//                b[ct] = 1 + i;
//            }
//        }
//        return true;

        Map<String, Integer> map = new HashMap<>(128);
        int count = 0;
        StringBuilder builderS = new StringBuilder(), builderT = new StringBuilder();
        for (char c : s.toCharArray()){
            String key = String.valueOf(c);
            if (!map.containsKey(key)) map.put(key, ++count);
            builderS.append("#").append(map.get(key));
        }
        map = new HashMap<>(128);
        count = 0;
        for (char c : t.toCharArray()){
            String key = String.valueOf(c);
            if (!map.containsKey(key)) map.put(key, ++count);
            builderT.append("#").append(map.get(key));
        }
        return builderS.toString().equals(builderT.toString());
    }

    public static void main(String[] args) {
        String s = "abb", t = "aba";
        boolean result = isIsomorphic(s, t);
        System.out.println(result);
    }

}
